#ifndef COMMON_H
#define COMMON_H

#include <iostream>
#include <sstream>  // 用于std::stringstream

// 调试日志开关：1启用，0禁用
#define SELF_DEBUG 1

#ifdef SELF_DEBUG
// 辅助类：用于拼接日志内容，析构时自动输出
class StreamLogger {
public:
    // 构造函数：先写入固定前缀（文件名、函数名、行号）
    StreamLogger(const char* file, const char* func, int line) {
        ss << "file: [" << file << "],func_name:[" << func << "],line:" << line << ":\n";
    }

    // 析构函数：自动将拼接的内容输出到cout
    ~StreamLogger() {
        std::cout << ss.str();
    }

    // 重载<<操作符，支持流式拼接任意类型
    template <typename T>
    StreamLogger& operator<<(const T& data) {
        ss << data;
        return *this;
    }

private:
    std::stringstream ss;  // 用于拼接日志内容
};

// PP：带可变参数的printf风格调试
#define PP(text, ...) [&]() { printf("file: [%s],func_name:[%s],line:%d:\n" text, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__); }()

// S()：基于stringstream的流式输出，自动拼接前缀并输出
#define S() StreamLogger(__FILE__, __FUNCTION__, __LINE__)

// P：固定字符串的printf风格调试
#define P(text) [&]() { printf("file: [%s],func_name:[%s],line:%d:\n" text "\n", __FILE__, __FUNCTION__, __LINE__); }()

#else
// 禁用调试时，所有宏为空（避免无效代码）
#define PP(text, ...)
#define S() (void)0  // 避免"S() << ..."编译错误
#define P(text)
#endif

#endif // COMMON_H